home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / cp2dekit / samples / wavpplay.cpp < prev    next >
C/C++ Source or Header  |  1996-12-29  |  11KB  |  396 lines

  1. //***************************************************************************
  2. //
  3. // this file is (c) '94-'96 Niklas Beisert
  4. //
  5. // this file is part of the cubic player development kit.
  6. // you may only use/modify/spread this file under the terms stated
  7. // in the cubic player development kit accompanying documentation.
  8. //
  9. //***************************************************************************
  10.  
  11. //[general]
  12. //  link=playwav
  13. //[fileselector]
  14. //  modextensions=WAV
  15. //  readinfos=_wavReadInfoReg
  16. //[filetype 28]
  17. //  color=6
  18. //  name=WAV
  19. //  interface=_plCubicPlayer
  20. //  player=_wavPlayer
  21.  
  22.  
  23. // interface example
  24.  
  25. #include <ctype.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <conio.h>
  29. #include <time.h>
  30. #include "pfilesel.h"
  31. #include "poutput.h"
  32. #include "player.h"
  33. #include "psetting.h"
  34. #include "binfile.h"
  35. #include "wave.h"
  36. #include "sets.h"
  37. #include "deviplay.h"
  38. #include "cpiface.h"
  39.  
  40. extern char plPause;
  41.  
  42. extern int plLoopMods;
  43.  
  44. static binfile *wavefile;
  45. static unsigned long wavelen;
  46. static unsigned long waverate;
  47.  
  48. static long starttime;
  49. static long pausetime;
  50. static char currentmodname[_MAX_FNAME];
  51. static char currentmodext[_MAX_EXT];
  52. static char *modname;
  53. static char *composer;
  54. static short vol;
  55. static short bal;
  56. static short pan;
  57. static char srnd;
  58. static long amp;
  59. static short speed;
  60. static short reverb;
  61. static short chorus;
  62. static char finespeed=8;
  63.  
  64.  
  65. static void wavDrawGStrings(short (*buf)[132])
  66. {
  67.   if (plScrWidth==80)
  68.   {
  69.     writestring(buf[0], 0, 0x09, " vol: ········ ", 15);
  70.     writestring(buf[0], 15, 0x09, " srnd: ·  pan: l···m···r  bal: l···m···r ", 41);
  71.     writestring(buf[0], 56, 0x09, " spd: ---% \x1D ptch: ---% ", 24);
  72.     writestring(buf[0], 6, 0x0F, "■■■■■■■■", (vol+4)>>3);
  73.     writestring(buf[0], 22, 0x0F, srnd?"x":"o", 1);
  74.     if (((pan+70)>>4)==4)
  75.       writestring(buf[0], 34, 0x0F, "m", 1);
  76.     else
  77.     {
  78.       writestring(buf[0], 30+((pan+70)>>4), 0x0F, "r", 1);
  79.       writestring(buf[0], 38-((pan+70)>>4), 0x0F, "l", 1);
  80.     }
  81.     writestring(buf[0], 46+((bal+70)>>4), 0x0F, "I", 1);
  82.     writenum(buf[0], 62, 0x0F, speed*100/256, 10, 3);
  83.     writenum(buf[0], 75, 0x0F, speed*100/256, 10, 3);
  84.  
  85.     writestring(buf[1], 57, 0x09, "amp: ...% filter: ...  ", 23);
  86.     writenum(buf[1], 62, 0x0F, amp*100/64, 10, 3);
  87.     writestring(buf[1], 75, 0x0F, "off", 3);
  88.  
  89.     waveinfo inf;
  90.     wpGetInfo(inf);
  91.     long tim;
  92.  
  93.     tim=inf.len/inf.rate;
  94.     writestring(buf[1], 0, 0x09, "  pos: ...% / ......k  size: ......k  len: ..:..", 57);
  95.     writenum(buf[1], 7, 0x0F, (inf.pos*100+(inf.len>>1))/inf.len, 10, 3);
  96.     writenum(buf[1], 43, 0x0F, (tim/60)%60, 10, 2, 1);
  97.     writestring(buf[1], 45, 0x0F, ":", 1);
  98.     writenum(buf[1], 46, 0x0F, tim%60, 10, 2, 0);
  99.     writenum(buf[1], 29, 0x0F, (inf.len>>(10-inf.stereo-inf.bit16)), 10, 6, 1);
  100.     writenum(buf[1], 14, 0x0F, (inf.pos>>(10-inf.stereo-inf.bit16)), 10, 6, 1);
  101.  
  102.     if (plPause)
  103.       tim=(pausetime-starttime)/CLK_TCK;
  104.     else
  105.       tim=(clock()-starttime)/CLK_TCK;
  106.  
  107.     writestring(buf[2],  0, 0x09, "   wave ········.···: ...............................               time: ..:.. ", 80);
  108.     writestring(buf[2],  8, 0x0F, currentmodname, 8);
  109.     writestring(buf[2], 16, 0x0F, currentmodext, 4);
  110.     writestring(buf[2], 22, 0x0F, modname, 31);
  111.     if (plPause)
  112.       writestring(buf[2], 58, 0x0C, "paused", 6);
  113.     writenum(buf[2], 74, 0x0F, (tim/60)%60, 10, 2, 1);
  114.     writestring(buf[2], 76, 0x0F, ":", 1);
  115.     writenum(buf[2], 77, 0x0F, tim%60, 10, 2, 0);
  116.   }
  117.   else
  118.   {
  119.     writestring(buf[0], 0, 0x09, "    volume: ················  ", 30);
  120.     writestring(buf[0], 30, 0x09, " surround: ·   panning: l·······m·······r   balance: l·······m·······r  ", 72);
  121.     writestring(buf[0], 102, 0x09,  " speed: ---% \x1D pitch: ---%    ", 30);
  122.     writestring(buf[0], 12, 0x0F, "■■■■■■■■■■■■■■■■", (vol+2)>>2);
  123.     writestring(buf[0], 41, 0x0F, srnd?"x":"o", 1);
  124.     if (((pan+68)>>3)==8)
  125.       writestring(buf[0], 62, 0x0F, "m", 1);
  126.     else
  127.     {
  128.       writestring(buf[0], 54+((pan+68)>>3), 0x0F, "r", 1);
  129.       writestring(buf[0], 70-((pan+68)>>3), 0x0F, "l", 1);
  130.     }
  131.     writestring(buf[0], 83+((bal+68)>>3), 0x0F, "I", 1);
  132.     writenum(buf[0], 110, 0x0F, speed*100/256, 10, 3);
  133.     writenum(buf[0], 124, 0x0F, speed*100/256, 10, 3);
  134.  
  135.     waveinfo inf;
  136.     wpGetInfo(inf);
  137.     long tim;
  138.     tim=inf.len/inf.rate;
  139.     writestring(buf[1], 0, 0x09, "    position: ...% / ......k  size: ......k  length: ..:..  opt: .....Hz, .. bit, ......", 92);
  140.     writenum(buf[1], 14, 0x0F, (inf.pos*100+(inf.len>>1))/inf.len, 10, 3);
  141.     writenum(buf[1], 53, 0x0F, (tim/60)%60, 10, 2, 1);
  142.     writestring(buf[1], 55, 0x0F, ":", 1);
  143.     writenum(buf[1], 56, 0x0F, tim%60, 10, 2, 0);
  144.     writenum(buf[1], 36, 0x0F, (inf.len>>(10-inf.stereo-inf.bit16)), 10, 6, 1);
  145.     writenum(buf[1], 21, 0x0F, (inf.pos>>(10-inf.stereo-inf.bit16)), 10, 6, 1);
  146.     writenum(buf[1], 65, 0x0F, inf.rate, 10, 5, 1);
  147.     writenum(buf[1], 74, 0x0F, 8<<inf.bit16, 10, 2, 1);
  148.     writestring(buf[1], 82, 0x0F, inf.stereo?"stereo":"mono", 6);
  149.  
  150.     writestring(buf[1], 92, 0x09, "   amplification: ...%  filter: ...     ", 40);
  151.     writenum(buf[1], 110, 0x0F, amp*100/64, 10, 3);
  152.     writestring(buf[1], 124, 0x0F, "off", 3);
  153.  
  154.     if (plPause)
  155.       tim=(pausetime-starttime)/CLK_TCK;
  156.     else
  157.       tim=(clock()-starttime)/CLK_TCK;
  158.  
  159.     writestring(buf[2],  0, 0x09, "      wave ········.···: ...............................  composer: ...............................                  time: ..:..    ", 132);
  160.     writestring(buf[2], 11, 0x0F, currentmodname, 8);
  161.     writestring(buf[2], 19, 0x0F, currentmodext, 4);
  162.     writestring(buf[2], 25, 0x0F, modname, 31);
  163.     writestring(buf[2], 68, 0x0F, composer, 31);
  164.     if (plPause)
  165.       writestring(buf[2], 100, 0x0C, "playback paused", 15);
  166.     writenum(buf[2], 123, 0x0F, (tim/60)%60, 10, 2, 1);
  167.     writestring(buf[2], 125, 0x0F, ":", 1);
  168.     writenum(buf[2], 126, 0x0F, tim%60, 10, 2, 0);
  169.   }
  170. }
  171.  
  172. static void normalize()
  173. {
  174.   speed=set.speed;
  175.   pan=set.pan;
  176.   bal=set.bal;
  177.   vol=set.vol;
  178.   amp=set.amp;
  179.   srnd=set.srnd;
  180.   reverb=set.reverb;
  181.   chorus=set.chorus;
  182.   wpSetAmplify(1024*amp);
  183.   wpSetVolume(vol, bal, pan, srnd);
  184.   wpSetSpeed(speed);
  185. //  wpSetMasterReverbChorus(reverb, chorus);
  186. }
  187.  
  188. static void wavCloseFile()
  189. {
  190.   wpClosePlayer();
  191.   wavefile->close();
  192. }
  193.  
  194. static int wavProcessKey(unsigned short key)
  195. {
  196.   int i;
  197.   switch (key)
  198.   {
  199.   case 'p': case 'P': case 0x10:
  200.     if (plPause)
  201.       starttime=starttime+clock()-pausetime;
  202.     else
  203.       pausetime=clock();
  204.     plPause=!plPause;
  205.     wpPause(plPause);
  206.     break;
  207.   case 0x8D00: //ctrl-up
  208.     wpSetPos(wpGetPos()-waverate);
  209.     break;
  210.   case 0x9100: //ctrl-down
  211.     wpSetPos(wpGetPos()+waverate);
  212.     break;
  213.   case 0x7300: //ctrl-left
  214.     wpSetPos(wpGetPos()-(wavelen>>5));
  215.     break;
  216.   case 0x7400: //ctrl-right
  217.     wpSetPos(wpGetPos()+(wavelen>>5));
  218.     break;
  219.   case 0x7700: //ctrl-home
  220.     wpSetPos(0);
  221.     break;
  222.   case '-':
  223.     if (vol>=2)
  224.       vol-=2;
  225.     wpSetVolume(vol, bal, pan, srnd);
  226.     break;
  227.   case '+':
  228.     if (vol<=62)
  229.       vol+=2;
  230.     wpSetVolume(vol, bal, pan, srnd);
  231.     break;
  232.   case '/':
  233.     if ((bal-=4)<-64)
  234.       bal=-64;
  235.     wpSetVolume(vol, bal, pan, srnd);
  236.     break;
  237.   case '*':
  238.     if ((bal+=4)>64)
  239.       bal=64;
  240.     wpSetVolume(vol, bal, pan, srnd);
  241.     break;
  242.   case ',':
  243.     if ((pan-=4)<-64)
  244.       pan=-64;
  245.     wpSetVolume(vol, bal, pan, srnd);
  246.     break;
  247.   case '.':
  248.     if ((pan+=4)>64)
  249.       pan=64;
  250.     wpSetVolume(vol, bal, pan, srnd);
  251.     break;
  252.   case 0x3c00: //f2
  253.     if ((vol-=8)<0)
  254.       vol=0;
  255.     wpSetVolume(vol, bal, pan, srnd);
  256.     break;
  257.   case 0x3d00: //f3
  258.     if ((vol+=8)>64)
  259.       vol=64;
  260.     wpSetVolume(vol, bal, pan, srnd);
  261.     break;
  262.   case 0x3e00: //f4
  263.     wpSetVolume(vol, bal, pan, srnd=srnd?0:2);
  264.     break;
  265.   case 0x3f00: //f5
  266.     if ((pan-=16)<-64)
  267.       pan=-64;
  268.     wpSetVolume(vol, bal, pan, srnd);
  269.     break;
  270.   case 0x4000: //f6
  271.     if ((pan+=16)>64)
  272.       pan=64;
  273.     wpSetVolume(vol, bal, pan, srnd);
  274.     break;
  275.   case 0x4100: //f7
  276.     if ((bal-=16)<-64)
  277.       bal=-64;
  278.     wpSetVolume(vol, bal, pan, srnd);
  279.     break;
  280.   case 0x4200: //f8
  281.     if ((bal+=16)>64)
  282.       bal=64;
  283.     wpSetVolume(vol, bal, pan, srnd);
  284.     break;
  285.   case 0x4300: //f9
  286.   case 0x8500: //f11
  287.     if ((speed-=finespeed)<16)
  288.       speed=16;
  289.     wpSetSpeed(speed);
  290.     break;
  291.   case 0x4400: //f10
  292.   case 0x8600: //f12
  293.     if ((speed+=finespeed)>2048)
  294.       speed=2048;
  295.     wpSetSpeed(speed);
  296.     break;
  297.   case 0x5f00: // ctrl f2
  298.     if ((amp-=4)<4)
  299.       amp=4;
  300.     wpSetAmplify(1024*amp);
  301.     break;
  302.   case 0x6000: // ctrl f3
  303.     if ((amp+=4)>252)
  304.       amp=252;
  305.     wpSetAmplify(1024*amp);
  306.     break;
  307.   case 0x8900: // ctrl f11
  308.     finespeed=(finespeed==8)?1:8;
  309.     break;
  310.   case 0x6a00:
  311.     normalize();
  312.     break;
  313.   case 0x6900:
  314.     set.pan=pan;
  315.     set.bal=bal;
  316.     set.vol=vol;
  317.     set.speed=speed;
  318.     set.amp=amp;
  319.     set.srnd=srnd;
  320.     break;
  321.   case 0x6b00:
  322.     pan=64;
  323.     bal=0;
  324.     vol=64;
  325.     speed=256;
  326.     amp=64;
  327.     wpSetVolume(vol, bal, pan, srnd);
  328.     wpSetSpeed(speed);
  329.     wpSetAmplify(1024*amp);
  330.     break;
  331.   default:
  332.     if (plrProcessKey)
  333.     {
  334.       int ret=plrProcessKey(key);
  335.       if (ret==2)
  336.         cpiResetScreen();
  337.       if (ret)
  338.         return 1;
  339.     }
  340.     return 0;
  341.   }
  342.   return 1;
  343. }
  344.  
  345.  
  346. static int wavLooped()
  347. {
  348.   wpSetLoop(plLoopMods);
  349.   wpIdle();
  350.   if (plrIdle)
  351.     plrIdle();
  352.   return !plLoopMods&&wpLooped();
  353. }
  354.  
  355.  
  356. static int wavOpenFile(const char *path, moduleinfostruct &info, binfile *wavf)
  357. {
  358.   if (!wavf)
  359.     return -1;
  360.  
  361.   _splitpath(path, 0, 0, currentmodname, currentmodext);
  362.   modname=info.modname;
  363.   composer=info.composer;
  364.  
  365.   cputs("preloading ");
  366.   cputs(currentmodname);
  367.   cputs(currentmodext);
  368.   cputs("...\r\n");
  369.  
  370.   wavefile=wavf;
  371.  
  372.   plIsEnd=wavLooped;
  373.   plProcessKey=wavProcessKey;
  374.   plDrawGStrings=wavDrawGStrings;
  375.   plGetMasterSample=plrGetMasterSample;
  376.   plGetRealMasterVolume=plrGetRealMasterVolume;
  377.  
  378.   if (!wpOpenPlayer(*wavefile, cfGetProfileBool2(cfSoundSec, "sound", "wavetostereo", 1, 1)))
  379.     return -1;
  380.  
  381.   starttime=clock();
  382.   normalize();
  383.  
  384.   waveinfo inf;
  385.   wpGetInfo(inf);
  386.   wavelen=inf.len;
  387.   waverate=inf.rate;
  388.  
  389.   return 0;
  390. }
  391.  
  392. extern "C"
  393. {
  394.   cpifaceplayerstruct wavPlayer = {wavOpenFile, wavCloseFile};
  395. };
  396.